home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / wildcard.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  3KB  |  158 lines

  1. /* Suchen mit DOS-Wildcards */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                      Modul: WILDCARD.C
  6. *                                     (c) by TheoSoft '93
  7. *                             Ersatz für rekursive alte Funktion
  8. *
  9. *****************************************************************************/
  10. #include <stdio.h>
  11.  
  12. char *match(char *first, register char *string, register char *pattern, int *len, char all, char one);
  13. char *imatch(char *first, register char *string, register char *pattern, int *len, char all, char one);
  14.  
  15. char *match(char *first, register char *string, register char *pattern, int *len, char all, char one)
  16. {
  17.    register char *s, *p, *f=NULL;
  18.    s=string; 
  19.    p=pattern;
  20.  
  21.    while(*p == all || *p == one)
  22.    {
  23.       if(*p == all)
  24.       {
  25.          f=first;
  26.          break;
  27.       }
  28.       p++;
  29.     }
  30.    p=pattern;
  31.  
  32.    do
  33.    {
  34.       if((*p != all) && (*p != one) && (*p != *s))
  35.       {
  36.           string++;
  37.           s=string;
  38.           p=pattern;
  39.       }
  40.       else
  41.       {
  42.          if(*p == all)
  43.          {
  44.             while((*p == all) || (*p == one))
  45.                p++;
  46. /* '*' soll 0-max. Widerholungen sein.
  47.             s++;
  48. */
  49.                 while(*s && (*s != *p))
  50.                    s++;
  51.          }
  52.          else
  53.          {
  54.             s++;
  55.             p++;
  56.          }
  57.       }
  58.    }
  59.    while(*string && *p);
  60.    if(f)
  61.        *len=(int)(s-f);
  62.    else
  63.        *len=(int)(s-string);
  64.    return(*string?(f?f:string):NULL);
  65. }
  66.  
  67. char *imatch(char *first, register char *string, register char *pattern, int *len, char all, char one)
  68. {
  69.    register char *s, *p, *f=NULL;
  70.    s=string; 
  71.    p=pattern;
  72.    
  73.    while(*p == all || *p == one)
  74.    {
  75.       if(*p == all)
  76.       {
  77.          f=first;
  78.          break;
  79.       }
  80.       p++;
  81.     }
  82.    p=pattern;
  83.  
  84.    do
  85.    {
  86.       if((*p != all) && (*p != one) && (__tolower(*p) != __tolower(*s)))
  87.       {
  88.           string++;
  89.           s=string;
  90.           p=pattern;
  91.       }
  92.       else
  93.       {
  94.          if(*p == all)
  95.          {
  96.             while((*p == all) || (*p == one))
  97.                p++;
  98. /* '*' soll 0-max. Widerholungen sein.
  99.             s++;
  100. */
  101.                 while(*s && (__tolower(*s) != __tolower(*p)))
  102.                    s++;
  103.          }
  104.          else
  105.          {
  106.             s++;
  107.             p++;
  108.          }
  109.       }
  110.    }
  111.    while(*string && *p);
  112.    if(f)
  113.        *len=(int)(s-f);
  114.    else
  115.        *len=(int)(s-string);
  116.    return(*string?(f?f:string):NULL);
  117. }
  118.  
  119. char *rmatch(char *str, register int index, register char *pattern, int *len, char all, char one)
  120. {
  121.     register int i;
  122.     register char *cp;
  123.     for(i=index; i>=0; i--)
  124.     {
  125.       if((cp=match(str,&str[i],pattern,len,all,one))!=NULL)
  126.           return(cp);
  127.     }
  128.     return(NULL);
  129. }
  130.  
  131. char *rimatch(char *str, register int index, register char *pattern, int *len, char all, char one)
  132. {
  133.     register int i,k;
  134.     register char *cp;
  135.     for(i=index; i>=0; i--)
  136.     {
  137.       if((cp=imatch(str,&str[i],pattern,len,all,one))!=NULL)
  138.           return(cp);
  139.     }
  140.     return(NULL);
  141. }
  142.  
  143. /*
  144. main()
  145. {
  146.    int len=0;
  147.    char *cp;
  148. appl_init();
  149.    cp=match("ng der Infozeile beim Blockmarkieren mit der Maus.","ei*x",&len, '*', '?');
  150.    if(cp)
  151.        printf("\33H|%s|%d",cp,len);
  152.     else
  153.        printf("\33Hnegativ");
  154. appl_exit();
  155. }
  156.  
  157. */
  158.